package fr.miage.orleans.aar.creation;

import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import fr.miage.orleans.aar.ejb.FacadeBean;
import fr.miage.orleans.aar.ejb.FacadeGettersBean;
import fr.miage.orleans.aar.ejb.FacadeGettersVoBean;
import fr.miage.orleans.aar.ejb.peupler.FacadePeuplerBean;
import fr.miage.orleans.aar.modele.Equipe;
import fr.miage.orleans.aar.modele.Joueur;
import fr.miage.orleans.aar.modele.PosteJoueur;
import fr.miage.orleans.aar.modele.utils.Peupler;
import fr.miage.orleans.aar.modele.valueobject.ValueObjectEquipeDetail;

/**
 * Servlet implementation class InscriptionServlet
 */
@WebServlet(name = "/CreationEquipeServlet", urlPatterns = { "/creationEquipe" })
public class CreationEquipeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private static final String STRING_ACTION = "action";

	@EJB
	private FacadeBean facade;

	@EJB
	private FacadeGettersVoBean facadeGettersVo;
	@EJB
	private FacadeGettersBean facadeGetters;
	@EJB
	private FacadePeuplerBean facadePeupler;

	private static final String SA_EQUIPES = "equipes";
	private static final String SA_DETAIL_EQUIPE = "detail_equipe";
	private static final String SA_POSTEJOUEUR  = "posteJoueur";
	private static final String JSP_CONSULTATION ="/WEB-INF/consultation.jsp";
	private static final String JSP_CREATION_EQUIPE = "WEB-INF/creation_equipe.jsp";
	private static final String JSP_DETAIL_EQUIPE = "WEB-INF/consultation_detail_equipe.jsp";


	/**
	 * Les actions
	 */
	private static final String ACTION_CREATE_EQUIPE = "createEquipe";
	private static final String ACTION_CREATE = "create";
	private static final String ACTION_ADD_JOUEUR = "addJoueurEquipe";
	private static final String ACTION_CREATE_EQUIPE_PLAYER = "createEquipeWithPlayer";

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public CreationEquipeServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

	protected void processIndex(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher(JSP_CONSULTATION).forward(request, response);

	}

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");

		String action = request.getParameter(STRING_ACTION);
		if (action == null || action.isEmpty()) {
			this.processIndex(request, response);
		} else {
			switch (action) {
			case ACTION_CREATE_EQUIPE: {
				this.processCreateEquipe(request, response);
				break;
			}
			case ACTION_ADD_JOUEUR:{
				this.ProcessAddJoueurEquipe(request, response);
				break;
			}
			case ACTION_CREATE_EQUIPE_PLAYER:{
				this.ProcessCreateEquipeWithPlayer(request, response);
				break;
			}
			case ACTION_CREATE:{
				this.processCreationInscription(request, response);
				break;
			}
			default: {
				this.processIndex(request, response);
			}
			}
		}
	}


	protected void ProcessAddJoueurEquipe(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession(true);
		String posteJoueur = request.getParameter("posteJoueur");
		if(posteJoueur.equals("0")){
			request.getRequestDispatcher(JSP_CONSULTATION).forward(request, response);
		}
		else{    	
			int idEquipe = Integer.parseInt(request.getParameter("idEquipe"));
			String nomJoueur =request.getParameter("nomJoueur");
			String prenomJoueur = request.getParameter("prenomJoueur");
			int idPosteJoueur =Integer.parseInt(request.getParameter("posteJoueur"));
			PosteJoueur pj = facadeGetters.getPosteJoueurById(idPosteJoueur);
			Joueur j = facade.createJoueur(nomJoueur, prenomJoueur, pj);
			facade.addJoueurToEquipe(idEquipe, j.getPersonneId());
			ValueObjectEquipeDetail equipes = facadeGettersVo.getVoEquipeDetail(idEquipe);
			session.setAttribute(SA_DETAIL_EQUIPE, equipes);
			request.getRequestDispatcher(JSP_DETAIL_EQUIPE).forward(request, response);
		}
	}

	protected void ProcessCreateEquipeWithPlayer(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession(true);
		Collection<PosteJoueur> postes = facadeGetters.getPostesJoueurs();
		session.setAttribute(SA_POSTEJOUEUR, postes);		
		request.getRequestDispatcher(JSP_CREATION_EQUIPE).forward(request, response);
	}


	protected void processCreationInscription(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession(true);
		String nomEquipe = request.getParameter("EquipeName");
		Equipe e = this.facade.createEquipe(nomEquipe);
		//Creer les joueurs
		for(int i = 0 ; i < 15 ; ++i)
		{

			if(request.getParameter("nom"+i) != null && !request.getParameter("nom"+i).equals("")
				&& request.getParameter("prenom"+i) != null && !request.getParameter("prenom"+i).equals("")
				&& request.getParameter("poste"+i) != null && !request.getParameter("poste"+i).equals(""))
			{
				//Le joueur existe et tout ses attributs sont set

				String nom = request.getParameter("nom"+i);
				String prenom = request.getParameter("prenom"+i);
				String posteJoueurId = request.getParameter("poste"+i);
				PosteJoueur posteJoueur = facadeGetters.getPosteJoueurById(Integer.parseInt(posteJoueurId));
				Joueur j = this.facade.createJoueur(nom, prenom, posteJoueur);
				this.facade.addJoueurToEquipe(e.getEquipeId(), j.getPersonneId());
			}
		}
		ValueObjectEquipeDetail equipes = facadeGettersVo.getVoEquipeDetail(e.getEquipeId());
		session.setAttribute(SA_DETAIL_EQUIPE, equipes);
		Collection<PosteJoueur> postes = facadeGetters.getPostesJoueurs();
		session.setAttribute(SA_POSTEJOUEUR, postes);
		request.getRequestDispatcher(JSP_DETAIL_EQUIPE).forward(request, response);
	}

	protected void processCreateEquipe(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession(true);
		String nomEquipe = request.getParameter("nomEquipe");
		Equipe e = facade.createEquipe(nomEquipe);
		String nbJoueur = request.getParameter("nbJoueurs");
		int nbJoueurs = Integer.parseInt(nbJoueur);

		List<PosteJoueur> postes = (List<PosteJoueur>) facadeGetters.getPostesJoueurs();
		Collection<Joueur> joueurs = new HashSet<>();
		//création des 11 premiers joueur
		joueurs.add(Peupler.creerJoueur(facadePeupler,postes.get(0)));
		for (int i = 0; i < 5; ++i) {
			joueurs.add(Peupler.creerJoueur(facadePeupler, postes.get(1)));
			joueurs.add(Peupler.creerJoueur(facadePeupler, postes.get(2)));
		}
		//Création des joueurs supplémentaires
		int nbJoueursSupp = (nbJoueurs - 11);
		for (int i = 0; i < nbJoueursSupp; ++i) {
			joueurs.add(Peupler.creerJoueur(facadePeupler));
		}
		facade.addJoueursToEquipe(e, joueurs);

		Collection<ValueObjectEquipeDetail> equipes = facadeGettersVo.getVoAllEquipes();
		session.setAttribute(SA_EQUIPES, equipes);
		request.getRequestDispatcher(JSP_CONSULTATION).forward(request, response);
	}



}
